#include "../comm/httplib.h"
#include "compile_run.hpp"

using namespace ns_compile_and_run;
using namespace httplib;

void Usage(std::string proc)
{
    std::cerr << "Usage: " << "\n\t" << proc << " port" << std::endl;
}


int main(int argc, char* argv[])
{
    if(argc != 2)
    {
        Usage(argv[0]);
        return 1;
    }

    Server svr;
    // 注册回调函数
    // svr.Get("/hello", [](const Request& req, Response& resp){
    //     // 基本测试
    //     resp.set_content("hello httplib, 你好 httplib！", "text/plain; charset=utf-8");
    // });

    svr.Post("/compile_and_run", [](const Request& req, Response& resp){
        // 用户请求的服务正文就是我们想要的 json string
        std::string in_json = req.body;
        std::string out_json;
        if(!in_json.empty())
        {
            CompileAndRun::Start(in_json, &out_json);
            resp.set_content(out_json, "application/json; charset=utf-8");
        }
    });

    // svr.set_base_dir("../wwwroot"); // 设置网站首页
    svr.listen("0.0.0.0", atoi(argv[1])); // 启动 http 服务

    return 0;
}


// 编译服务随时可能被多个人请求, 所以必须要保证用户提交代码后,
// 所形成形成的源文件和各种临时文件具有唯一性, 否则多个用户之间
// 的请求会相互影响

// 将编译服务打包形成一个网络服务(cpp-httplib)

// int main()
// {
//     // 客户端通过 HTTP 请求将 JSON 格式的字符串传递给服务端

//     // 手动构建 JSON 请求
//     std::string in_json;
//     Json::Value in_value;
//     in_value["code"] = R"(#include <iostream>

// using namespace std;

// int main()
// {
//     cout << "You can see me!" << endl;
//     // 1. 测试 CPU 超出限制
//     // while(1);

//     // 2. 测试内存超出限制
//     // int *p = new int[1024 * 1024 * 40];
    
//     // 3. 测试段错误
//     // int *p = nullptr;
//     // *p = 100;

//     // 4. 测试浮点数异常
//     // int a = 10;
//     // a /= 0;

//     // 5. 测试编译出错
//     // aaaa;

//     return 0;
// })";
//     in_value["input"] = "";
//     in_value["cpu_limit"] = 1; // 1s
//     in_value["mem_limit"] = 10240 * 3; // 30M
//     Json::StyledWriter writer;
//     in_json = writer.write(in_value);

//     std::cout << in_json << std::endl;

//     // out_json 是将要给用户返回的 JSON 字符串
//     std::string out_json;
//     CompileAndRun::Start(in_json, &out_json);

//     std::cout << out_json << std::endl;

//     return 0;
// }



/******** 以下代码是前期代码 **********/

// #include "compiler.hpp"
// #include "runner.hpp"
// #include "../comm/util.hpp"

// using namespace ns_compiler;
// using namespace ns_runner;
// using namespace ns_util;

// int main()
// {
//     std::string code = "code";
//     Compiler::Compile(code);
//     // 生成了可执行程序, 才启动 Run 运行功能
//     if(FileUtil::IsFileExists(PathUtil::Exe(code))) 
//     {
//         Runner::Run(code);
//     }

//     return 0;
// }